//package top.jiangqiang.qyblog.core.db;
//
//import cn.hutool.core.date.DatePattern;
//import cn.hutool.core.date.DateTime;
//import cn.hutool.core.date.DateUtil;
//import com.baomidou.mybatisplus.core.mapper.BaseMapper;
//import lombok.RequiredArgsConstructor;
//import org.springframework.stereotype.Component;
//import org.springframework.transaction.annotation.Transactional;
//import top.jiangqiang.qyblog.common.exception.JsonException;
//import top.jiangqiang.qyblog.common.utils.FileUtil;
//import top.jiangqiang.qyblog.common.utils.JSONUtil;
//import top.jiangqiang.qyblog.common.utils.SpringUtil;
//import top.jiangqiang.qyblog.core.base.entity.BaseEntity;
//import top.jiangqiang.qyblog.core.base.service.impl.BaseServiceImpl;
//
//import java.io.File;
//import java.nio.charset.StandardCharsets;
//import java.time.LocalDateTime;
//import java.util.Date;
//import java.util.List;
//import java.util.Map;
//
///**
// * @author Jiangqiang
// * @version 1.0
// * @date 2022/12/9 16:09
// */
//@Component
//@RequiredArgsConstructor
//public class RecoverService {
//
//    /**
//     * 从指定目录下根据日期查询子目录中的数据
//     *
//     * @param dir 指定目录
//     */
//    @SuppressWarnings("unchecked")
//    @Transactional
//    public void jsonToDb(File dir) {
//        //key是bean名字，value是service对象
//        Map<String, BaseServiceImpl> beansOfType = SpringUtil.getBeansOfType(BaseServiceImpl.class);
//        for (Map.Entry<String, BaseServiceImpl> entry : beansOfType.entrySet()) {
//            BaseServiceImpl<? extends BaseMapper<?>, ?> service = entry.getValue();
//            writeToDb(dir, service);
//        }
//    }
//
//    @SuppressWarnings("unchecked")
//    private void writeToDb(File dir, BaseServiceImpl service) {
//        File file = FileUtil.file(getLatestDir(dir), service.getTableName() + ".json");
//        if (file.exists()) {
//            List<? extends BaseEntity> baseEntities = JSONUtil.parseArray(FileUtil.readString(file, StandardCharsets.UTF_8), service.getEntityClass());
//            baseEntities.forEach(this::setValue);
//            service.saveBatch(baseEntities);
//        }
//    }
//
//    /**
//     * json转对象后，设置对应的时间字段
//     *
//     * @param baseEntity
//     */
//    public void setValue(BaseEntity baseEntity) {
//        LocalDateTime now = LocalDateTime.now();
//        baseEntity.setCreateTime(now);
//        baseEntity.setUpdateTime(now);
//    }
//
//    /**
//     * 获取之前备份的最新的一个目录
//     *
//     * @return
//     */
//    private File getLatestDir(File dir) {
//        Date date = new DateTime();
//        for (int i = 0; i < 365; i++) {
//            File file = FileUtil.file(dir, DateUtil.format(date, DatePattern.PURE_DATE_PATTERN));
//            if (file.exists()) {
//                return file;
//            } else {
//                date = DateUtil.offsetDay(date, -1);
//            }
//        }
//        throw new JsonException("目录不存在备份数据:" + dir.getAbsolutePath());
//    }
//}
